home *** CD-ROM | disk | FTP | other *** search
/ Amiga Magazin: Amiga-CD 1996 September & October / Amiga-CD 1996 #9-10.iso / aminet / 7-96 / alphaspell / interfaces / textra / aspell.textra
Text File  |  1996-05-10  |  18KB  |  567 lines

  1. /**************************************************************************/
  2. /* $VER: ASpell.textra 2.2 (10 May 1996)                                  */
  3. /* The AlphaSpell GUI © Copyright Fergus Duniho 1995-6                    */
  4. /**************************************************************************/
  5.  
  6. OPTIONS RESULTS
  7. OPTIONS FAILAT 20
  8. SIGNAL ON SYNTAX
  9. SIGNAL ON FAILURE
  10. ARG options
  11.  
  12. CALL OpenLib("rexxsupport.library")
  13. CALL OpenLib("rexxtricks.library")
  14. IF REXXTRICKSVERSION() < "38.6" THEN EXIT
  15.  
  16. GUI = "AlphaSpell:ASpell.gui"
  17. PSC = GetScreen()
  18. EditPort = GetEditPort()
  19.  
  20. tempfile = "T:Temp" || TIME(s)
  21. win.title = "Select a Word:"
  22. win.gadgettext = "_Accept|_Cancel"
  23. win.pubscreen = PSC
  24. win.width = 40
  25. win.sort = "FALSE"
  26. win.multiselect = "FALSE"
  27.  
  28. CALL Spellcheck()
  29. CALL Cleanup()
  30. EXIT
  31.  
  32. /**************************************************************************/
  33. /* SetUp() -- Opens command hosts, etc.                                   */
  34. /**************************************************************************/
  35.  
  36. SpellCheck:
  37.  
  38. /**************************************************************************/
  39. /* Launch AlphaSpell                                                      */
  40. /**************************************************************************/
  41.  
  42. IF Show("P", "ALPHASPELL") ~= 1 THEN DO
  43.     ADDRESS COMMAND "run >NIL: AlphaSpell:AlphaSpell AREXX"
  44.     ADDRESS COMMAND "WaitForPort ALPHASPELL"
  45.     shutdown = 1
  46. END
  47. ELSE shutdown = 0
  48.  
  49. IF SHOW("P", "ALPHASPELL") = 0 THEN RETURN
  50.  
  51. /**************************************************************************/
  52. /* Launch Varexx                                                          */
  53. /**************************************************************************/
  54.  
  55. /* Check Varexx is loaded if not load it */
  56.  
  57. IF SHOW("P","VAREXX") ~= 1 THEN DO
  58.     ADDRESS COMMAND "run >NIL: varexx"
  59.     ADDRESS COMMAND "WaitForPort VAREXX"
  60. END
  61. ADDRESS VAREXX
  62.  
  63. IF OPENPORT("HOLLY") = 0 THEN DO
  64.     ADDRESS ALPHASPELL ANNOUNCE "Could not open Varexx"
  65.     RETURN
  66. END
  67. version
  68. IF RESULT < 1.6 THEN DO
  69.     ADDRESS ALPHASPELL ANNOUNCE "You need version 1.6+ of Varexx"
  70.     RETURN
  71. END
  72. "load" GUI "HOLLY PS" PSC
  73. vhost = RESULT
  74. ADDRESS VALUE vhost
  75.  
  76. IF EditPort ~= "" THEN ADDRESS VALUE EditPort
  77. ADDRESS
  78.  
  79. /**************************************************************************/
  80. /* Localize gadget text for chosen language                               */
  81. /**************************************************************************/
  82.  
  83. lang = GetENV("language")
  84. IF lang ~= "" & lang ~= "english" THEN DO
  85.     catalog = "AlphaSpell:Catalogs/ASpell." || lang
  86.     IF Exists(catalog) THEN DO
  87.         CALL READFILE catalog, lines
  88.         DO x = 1 to lines.0
  89.             INTERPRET "setlabel" "'"lines.x"'"
  90.         END
  91.     END
  92. END
  93.  
  94. /**************************************************************************/
  95. /* Show About screen while AlphaSpell checks document.                    */
  96. /**************************************************************************/
  97.  
  98. show about
  99.  
  100. ADDRESS ALPHASPELL WHO
  101. name = RESULT
  102. IF name ~= "" THEN settext share name
  103. CALL ReadPrefs()
  104. IF Pos("CLIP", options) > 0 THEN DO
  105.     CALL READCLIPBOARD "0", "lines"
  106.     CALL WRITEFILE  tempfile, "lines"
  107. END
  108. ELSE CALL SaveTemp()
  109.  
  110. /**************************************************************************/
  111. /* Spell check tempfile with AlphaSpell                                   */
  112. /**************************************************************************/
  113.  
  114. IF Pos("TEX", options) > 0 THEN switches = "TEX"
  115. ELSE switches = ""
  116. ADDRESS ALPHASPELL "CHECK" tempfile tempfile "PATH" dict_path dict_list switches
  117.  
  118. /**************************************************************************/
  119. /* Set Lists                                                              */
  120. /**************************************************************************/
  121.  
  122. CALL ReadList "UNFOUND"
  123. IF UNFOUND.0 = 0 THEN DO
  124.     ADDRESS ALPHASPELL ANNOUNCE "Spell Checking Finished:\n\nNo Misspellings Found\n"
  125.     RETURN
  126. END
  127. current = 1
  128. LWORDS.0 = 0
  129. MWORDS.0 = 0
  130.  
  131. hide
  132. show main
  133. IF name = "" THEN setbar ed max 2
  134. window front activate
  135. CALL SetTarget UNFOUND.1
  136.  
  137. /**************************************************************************/
  138. /* MAIN LOOP -- Check for GUI events                                      */
  139. /**************************************************************************/
  140.  
  141. DO FOREVER
  142.     CALL WAITPKT("HOLLY")
  143.     packet = GETPKT("HOLLY")
  144.     IF packet ~= '00000000'x THEN DO
  145.         class = GETARG(packet)
  146.         SELECT
  147.             WHEN class = "CLOSEWINDOW" THEN LEAVE
  148.             WHEN class = "LEARN" THEN CALL Learn()
  149.             WHEN class = "FIND" THEN flag = FindWord(flag)
  150.             WHEN class = "REPLACE" THEN CALL ReplaceWord()
  151.             WHEN class = "GUESS" THEN CALL Guess()
  152.             WHEN class = "NEXT" THEN CALL SetTarget("+1")
  153.             WHEN class = "PREV" THEN CALL SetTarget("-1")
  154.             WHEN class = "FIRST" THEN CALL SetTarget(1)
  155.             WHEN class = "LAST" THEN CALL SetTarget(UNFOUND.0)
  156.             WHEN class = "SELECT" THEN CALL ChooseWord()
  157.             WHEN Word(class, 1) = "METHOD" THEN DO
  158.                 IF Word(class, 2) = "0" THEN set ed enable
  159.                 ELSE set ed disable
  160.             END
  161.             WHEN class = "PREFS" THEN DO
  162.                 CALL Preferences()
  163.                 CALL SetTarget(current)
  164.                 IF name = "" THEN setbar ed max 2
  165.             END
  166.             OTHERWISE NOP
  167.         END
  168.         window front activate
  169.     END
  170. END
  171. IF LWORDS.0 + MWORDS.0 > 0 THEN DO
  172.     hide
  173.     show learn
  174.     CALL QSORT "LWORDS"
  175.     LWORDS.count = LWORDS.0
  176.     setlist lwords clear stem LWORDS select LWORDS.1
  177.     CALL QSORT "MWORDS"
  178.     MWORDS.count = MWORDS.0
  179.     setlist mwords clear stem MWORDS select MWORDS.1
  180.     DO FOREVER
  181.         CALL WAITPKT("HOLLY")
  182.         packet = GETPKT("HOLLY")
  183.         IF packet ~= '00000000'x THEN DO
  184.             class = GETARG(packet)
  185.             SELECT
  186.                 WHEN class = "CLOSEWINDOW" THEN LEAVE
  187.                 WHEN class = "SAVEWORDS" THEN DO
  188.                     CALL SaveList()
  189.                     LEAVE
  190.                 END
  191.                 WHEN class = "MOVE" THEN CALL Move()
  192.                 WHEN class = "RML" THEN CALL Lose("lwords")
  193.                 WHEN class = "RMM" THEN CALL Lose("mwords")
  194.                 OTHERWISE NOP
  195.             END
  196.             window front activate
  197.         END
  198.     END
  199. END
  200. ADDRESS
  201. RETURN
  202.  
  203. /**************************************************************************/
  204. /* VARIOUS SUBROUTINES                                                    */
  205. /**************************************************************************/
  206.  
  207. /**************************************************************************/
  208. /* SetTarget(word) -- Sets the word in the target string gadget           */
  209. /**************************************************************************/
  210.  
  211. SetTarget:
  212. IF DATATYPE(arg(1)) = "NUM" THEN DO
  213.     IF VERIFY(arg(1), "+-", "M") = 1 THEN current = current + arg(1)
  214.     ELSE current = arg(1)
  215.     IF current < 1 THEN current = UNFOUND.0
  216.     IF current > UNFOUND.0 THEN current = 1
  217.     settext target UNFOUND.current
  218.     settext replacement UNFOUND.current
  219. END
  220. ELSE DO
  221.     settext target arg(1)
  222.     settext replacement arg(1)
  223. END
  224. flag = 0 /* Word hasn't been searched for since selection */
  225. RETURN
  226.  
  227. /**************************************************************************/
  228. /* SetReplace() - Sets replacement string gadget                          */
  229. /**************************************************************************/
  230.  
  231. SetReplace:
  232. settext replacement arg(1)
  233. settext target UNFOUND.current
  234. RETURN
  235.  
  236. /**************************************************************************/
  237. /* Learn() -- Adds a word to LEARN, the words to learn list               */
  238. /**************************************************************************/
  239.  
  240. Learn:
  241. read target
  242. wrd = RESULT
  243. /* Tests whether wrd is lowercase */
  244. IF BITOR(wrd,," ") == wrd THEN DO
  245.     IF LSEARCH(wrd, "LWORDS") == -1 THEN DO
  246.         cnt = LWORDS.0 + 1
  247.         LWORDS.0 = cnt
  248.         LWORDS.cnt = wrd
  249.     END
  250. END
  251. ELSE DO
  252.     cur = LSEARCH(wrd, "MWORDS")
  253.     DO WHILE (MWORDS.cur = wrd) & (MWORDS.cur ~== wrd)
  254.         cur = cur + 1
  255.     END
  256.     IF cur == -1 THEN DO
  257.         cnt = MWORDS.0 + 1
  258.         MWORDS.0 = cnt
  259.         MWORDS.cnt = wrd
  260.     END
  261. END
  262. CALL SetTarget("+1")
  263. RETURN
  264.  
  265. /**************************************************************************/
  266. /* Guess() has AlphaSpell search for anagrams, matches, or guesses        */
  267. /**************************************************************************/
  268.  
  269. Guess:
  270. busy set
  271. read method
  272. mode = RESULT
  273. read replacement
  274. targ = RESULT
  275. SELECT
  276.     WHEN mode = 0 THEN DO
  277.         read ed
  278.         op = "ED" RESULT
  279.     END
  280.     WHEN mode = 2 THEN op = "ANAGRAMS"
  281.     WHEN mode = 3 THEN op = "CASE"
  282.     OTHERWISE op = ""
  283. END
  284.  
  285. ADDRESS ALPHASPELL "MATCH" targ op "TO" tempfile "PATH" dict_path dict_list
  286. CALL ReadList "GUESS"
  287. busy
  288. IF GUESS.0 > 0 THEN DO
  289.     IF VIEWLIST("GUESS", "win", "dest") = 1 THEN CALL SetReplace(dest.1)
  290. END
  291. ELSE ADDRESS ALPHASPELL ANNOUNCE "Search Complete:\n\nNo Match Found\n"
  292. RETURN
  293.  
  294. /**************************************************************************/
  295. /* ChooseWord() -- Select word from listview of unfound words             */
  296. /**************************************************************************/
  297.  
  298. ChooseWord:
  299. IF VIEWLIST("UNFOUND", "win", "dest") = 1 THEN CALL SetTarget(dest.1)
  300. IF dest.1 ~= "" THEN DO
  301.     current = LSEARCH(dest.1, "UNFOUND")
  302.     uwrd = UPPER(dest.1)
  303.     DO WHILE (UPPER(UNFOUND.current) = uwrd) & (UNFOUND.current ~= dest.1)
  304.         current = current + 1
  305.     END
  306. END
  307. RETURN
  308.  
  309. /**************************************************************************/
  310. /* SaveList() -- Saves words in the "LEARN" list to user dictionary       */
  311. /**************************************************************************/
  312.  
  313. SaveList:
  314. udict.low = MAKEPATH(dict_path, user_dict || ".ald")
  315. udict.mix = MAKEPATH(dict_path, user_dict || ".amd")
  316. read lwords LEARN
  317. LEARN.0 = LEARN.count
  318. IF LEARN.0 > 0 THEN DO
  319.     CALL WRITEFILE tempfile, "LEARN"
  320.     ADDRESS ALPHASPELL "ADD FROM" tempfile "TO" udict.low
  321. END
  322. read mwords LEARN
  323. LEARN.0 = LEARN.count
  324. IF LEARN.0 > 0 THEN DO
  325.     CALL WRITEFILE tempfile, "LEARN"
  326.     ADDRESS ALPHASPELL "ADD FROM" tempfile "TO" udict.mix
  327. END
  328. CALL DELETE tempfile
  329. RETURN
  330.  
  331. /**************************************************************************/
  332. /* Move() -- Moves word from mixed case listview to lowercase listview    */
  333. /**************************************************************************/
  334.  
  335. Move:
  336. setlist lwords BITOR(Lose("mwords"),," ")
  337. RETURN
  338.  
  339. /**************************************************************************/
  340. /* ReadList -- Reads words from tempfile to a list and sorts the list     */
  341. /**************************************************************************/
  342.  
  343. ReadList:
  344. CALL READFILE tempfile, arg(1)
  345. INTERPRET arg(1) || ".count =" arg(1) || ".0"
  346. CALL QSORT arg(1)
  347. RETURN
  348.  
  349. /**************************************************************************/
  350. /* Lose() -- Deletes a word from a listview                               */
  351. /**************************************************************************/
  352.  
  353. Lose:
  354. INTERPRET "read" arg(1) boo
  355. wrd = RESULT
  356. INTERPRET "setlist" arg(1) "wrd del"
  357. item = boo.select
  358. IF item = boo.count THEN item = item - 1
  359. INTERPRET "setlist" arg(1) "select s update" item
  360. RETURN wrd
  361.  
  362. /**************************************************************************/
  363. /* Preferences() -- Preferences GUI                                       */
  364. /**************************************************************************/
  365.  
  366. Preferences:
  367.  
  368. hide
  369. show prefs
  370. IF ~GetDir("AlphaSpell:Dict/", "#?", "langs", "D", "N") THEN RETURN
  371. CALL QSORT "langs"
  372. langs.count = langs.0
  373. setlist language clear stem langs
  374. IF LSEARCH(lang, langs) = -1 THEN setlist language langs.1
  375. ELSE setlist language select lang
  376. settext dict dict_list
  377. settext udict user_dict
  378. DO FOREVER
  379.     CALL WAITPKT("HOLLY")
  380.     packet = GETPKT("HOLLY")
  381.     IF packet ~= '00000000'x THEN DO
  382.         class = GETARG(packet)
  383.         SELECT
  384.             WHEN class = "CLOSEWINDOW" | class = "CANCEL" THEN LEAVE
  385.             WHEN class = "SAVE" | class = "USE" THEN DO
  386.                 read language
  387.                 lang = RESULT
  388.                 dict_path = "AlphaSpell:Dict/" || lang || "/"
  389.                 read dict
  390.                 dict_list = RESULT
  391.                 read udict
  392.                 user_dict = RESULT
  393.                 IF class = "SAVE" THEN CALL WritePrefs
  394.                 LEAVE
  395.             END
  396.             OTHERWISE NOP
  397.         END
  398.     END
  399. END
  400. hide
  401. show main
  402. RETURN
  403.  
  404. /**************************************************************************/
  405. /* WritePrefs() -- Writes Preferences to Icon                             */
  406. /**************************************************************************/
  407.  
  408. WritePrefs:
  409. CALL SETTOOLTYPEVALUE GUI, "LANG", lang
  410. CALL SETTOOLTYPEVALUE GUI, "DICT", dict_list
  411. CALL SETTOOLTYPEVALUE GUI, "USER", user_dict
  412. RETURN
  413.  
  414. /**************************************************************************/
  415. /* ReadPrefs() -- Read Preferences from ENV:ASpell.prefs or use defaults  */
  416. /**************************************************************************/
  417.  
  418. ReadPrefs:
  419. lang = GETTOOLTYPEVALUE(GUI, "LANG")
  420. dict_path = "AlphaSpell:Dict/" || lang || "/"
  421. dict_list = GETTOOLTYPEVALUE(GUI, "DICT")
  422. user_dict = GETTOOLTYPEVALUE(GUI, "USER")
  423. IF ~Exists(dict_path) THEN DO
  424.     ADDRESS ALPHASPELL ANNOUNCE dict_path "doesn't exist."
  425.     CALL Preferences()
  426.     show about
  427. END
  428. RETURN
  429.  
  430. /**************************************************************************/
  431. /* Cleanup() -- Closes down the GUI                                       */
  432. /**************************************************************************/
  433.  
  434. Cleanup:
  435. IF SHOWLIST("P", "HOLLY") = 1 THEN CALL CLOSEPORT ("HOLLY")
  436. IF SHOWLIST("P", "VAREXX") = 1 THEN ADDRESS "VAREXX" hide unload
  437. IF SHOWLIST("P", "ALPHASPELL") = 1 & shutdown = 1 THEN ADDRESS ALPHASPELL QUIT
  438. RETURN
  439.  
  440. /**************************************************************************/
  441. /* OpenLib(library) -- Checks that library exists and opens it if it does */
  442. /**************************************************************************/
  443.  
  444. OpenLib: PROCEDURE
  445.  
  446. IF EXISTS("libs:" || arg(1)) THEN DO
  447.     IF ~SHOW("L", arg(1)) THEN
  448.         IF ~ADDLIB(arg(1),0,-30,0) THEN EXIT
  449. END
  450. ELSE EXIT
  451. RETURN
  452.  
  453. /**************************************************************************/
  454. /* ERROR MESSAGES                                                         */
  455. /**************************************************************************/
  456.  
  457. failure:
  458. syntax:
  459. SAY "Error" rc  "-- Line" SIGL
  460. SAY errortext(rc)
  461. SAY sourceline(SIGL)
  462. CALL Cleanup()
  463. EXIT
  464.  
  465. /**************************************************************************/
  466. /* Functions to get around the limits of some text editors. You might or  */
  467. /* might not need some of these.                                          */
  468. /**************************************************************************/
  469.  
  470. /**************************************************************************/
  471. /* WordComp(string, word) -- Checks whether a target word can be parsed   */
  472. /* from a given string. This is useful if your text editor lacks a whole  */
  473. /* word search mode. You can search for a word, read the full text of the */
  474. /* found string, and compare them.                                        */
  475. /**************************************************************************/
  476.  
  477. WordComp: PROCEDURE
  478. Parse Arg str, wrd, x
  479. s = Index(str, wrd, x)
  480. IF s = 0 THEN RETURN 0
  481. IF s>1 THEN DO
  482.     c = Substr(str, s-1, 1)
  483.     IF Datatype(c, "A") = 1 | c = "'" THEN RETURN 0
  484. END
  485. s = s + Length(wrd)
  486. IF s > Length(str) THEN RETURN 1
  487. c = Substr(str, s, 1)
  488. IF Datatype(c, "M") = 1 THEN RETURN 0
  489. RETURN 1
  490. END
  491.  
  492. /**************************************************************************/
  493. /* EDITOR SPECIFIC SUBROUTINES                                            */
  494. /**************************************************************************/
  495.  
  496. /**************************************************************************/
  497. /* FindWord() -- Finds selected word in document                          */
  498. /**************************************************************************/
  499.  
  500. FindWord: PROCEDURE
  501. read target
  502. wrd = RESULT /* Reads selected word */
  503. ADDRESS
  504. IF arg(1) = 0 THEN GOTOXY 0 0
  505. DO FOREVER
  506.     FIND wrd
  507.     IF RESULT = "NOT FOUND" THEN DO
  508.         GOTOXY 0 0
  509.         LEAVE
  510.     END
  511.     GET cursor position
  512.     PARSE VAR RESULT col row
  513.     GET line row
  514.     IF WordComp(RESULT, wrd, col) = 1 THEN LEAVE
  515. END
  516.  
  517. ADDRESS
  518. RETURN 1
  519.  
  520. /**************************************************************************/
  521. /* ReplaceWord() -- Replaces selected word with word in string gadget     */
  522. /**************************************************************************/
  523.  
  524. ReplaceWord: PROCEDURE
  525. read replacement
  526. newword = RESULT
  527. ADDRESS
  528. KILLSELECT
  529. TEXT newword
  530. ADDRESS
  531. RETURN
  532.  
  533. /**************************************************************************/
  534. /* SaveTemp() -- Saves the current file as a temporary file               */
  535. /**************************************************************************/
  536.  
  537. SaveTemp:
  538. trace results
  539. ADDRESS
  540. lastline
  541. selectto 0 0
  542. copy
  543. unselect
  544. ADDRESS
  545. CALL READCLIPBOARD "0", "lines"
  546. CALL WRITEFILE  tempfile, "lines"
  547. RETURN
  548.  
  549. /**************************************************************************/
  550. /* GetEditPort() -- Makes sure the right text editor port is open.        */
  551. /**************************************************************************/
  552.  
  553. GetEditPort:
  554. IF Abbrev(Address(), "TEXTRA") = 1 THEN RETURN Address()
  555. IF ~SHOWLIST("P", "TEXTRA") THEN DO
  556.     CALL rtezrequest "TEXTRA unavailable", "_Abort", "Missing Port:"
  557.     EXIT
  558. END
  559. RETURN "TEXTRA"
  560.  
  561. /**************************************************************************/
  562. /* GetScreen() -- Returns the screen name                                 */
  563. /**************************************************************************/
  564.  
  565. GetScreen: PROCEDURE
  566. RETURN GETDEFAULTPUBSCREEN()
  567.